﻿
@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
</head>
<body>
    <div>
    </div>
</body>
</html>
<script src="~/Scripts/jquery-3.1.1.min.js"></script>
<script>
    //封装 sex利用了闭包形，相当于私有变量,外部是不能改的
    var Person = (function () {
        var sex = "纯爷们";
        return {
            name: "农码一生",
            getInfo: function () {
                console.log("name:" + this.name + ",sex:" + sex);
            }
        };
    })();

    //继承
    var Person1 = function () {
        this.name = "农码一生";
    }
    Person1.prototype.getInfo = function () {
        console.log(this.name);
    }
    var obj = function () { };
    obj.prototype = new Person1();//obj继承于Person

    //闭包
    for (var i = 0; i < 10; i++) {
        var t = setTimeout(function () {
            console.log(i);
        }, 100);
    }//打出来会是10 以为计时器还没开始 循环就已经执行完毕

    for (var i = 0; i < 10; i++) {
        (function (i) {
            var t = setTimeout(function () {
                console.log(i);
            }, 100);
        })(i);
    }//通过闭包为每次循环保存一个变量 打出来就会是0-10。

    //高阶函数
    var Person2 = (function () {
        var sex = "纯爷们";
        return {
            name: "农码一生",
            getInfo: function () {
                console.log("name:" + this.name + ",sex:" + sex);
            }
        };
    })();
    //当函数做被return时，那么就是高阶函数。
    var getInfo = function (callback) {
        $.ajax('url', function (data) {
            if (typeof callback === 'function') {
                callback(data);
            }
        });
    }
    getInfo(function (data) {
        alert(data.userName);
    });
    //getInfo在执行的时候，传入的参数是个函数。
    //当函数被当成参数传递时，那么这也是高阶函数。



    $(function () {
        Person.name = "测试名字";
        var o = new obj();
        o.getInfo();//直接调用原型中的getName（类似于C#中的调用父类方法）
        //console.log(Person);
    });
</script>